home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BBS in a Box 7
/
BBS in a Box - Macintosh - Volume VII (BBS in a Box) (January 1993).iso
/
Files
/
Prog
/
H-K
/
Inside Mac DA 2.4.cpt
/
IM Source
/
Search.Asm
< prev
next >
Wrap
Assembly Source File
|
1986-09-27
|
4KB
|
113 lines
; procedure Search(searchStr: Ptr; list: Ptr; var i: Integer;
;
; Diese Routine sucht das erste Auftreten eines Suchstrings in einer
; Liste. Sie geht davon aus, daß beim ersten Aufrufen von Search der
; Suchstring aus einem einzigen Zeichen besteht, beim nächsten aus zwei usw.
; Dies ist für alle solche Fälle praktisch, wo der User eine Eingabe über
; die Tastatur macht und das Programm sich in einer Liste von Strings
; gewissermaßen "vorwärtshangeln" soll, genau wie beim SFGetFile-Dialog.
; SearchStr ist ein Pointer auf den zu suchenden String, list ein Pointer
; auf die Liste. Das Format dieser Liste ist gleich dem Format der STR#-
; Resourcen; außerdem muß sie alphabetisch aufsteigend sortiert sein.
; I ist der Index, ab der die Suche in der Liste beginnt; nach Rückkehr
; von der Routine enthält i den Index des gefundenen Strings in der Liste.
; Beim ersten Aufruf von Search muß i = 0 oder = 1 sein.
;
; Version 1.0, 04.09.1986
; Version 1.1, 27.09.1986 Längen-Bug korrigiert
;
; Autor: Arne Schirmacher, Gutenbergstraße 14, 6070 Langen
xdef search
search
link A6,#0
movem.l A0/A3/A4/D0/D1/D5/D6/D7,-(SP)
move.l 16(A6),A3 ; A3: Ptr auf searchString
move.l 12(A6),A4 ; A4: Ptr auf Liste
move.w (A4),D5 ; D5: # Items in Liste
clr.w D6
move.b (A3),D6 ; D6: Länge searchString
movea.l 8(A6),A0
move.w (A0),D7 ; D7: Index in Liste
tst.w D7 ; falls Index = 0:
bne.s L7 ; Index := 1
move.w #1,D7
; Eintrag in Liste finden, ab dem Vergleich durchgeführt werden soll
L7 sub.w D7,D5 ; Anzahl restlicher Strings berechnen
bmi.s L6 ; falls Ende erreicht, abbrechen
move.w D7,D0 ; Index nach D0
subq.w #1,D0 ; für DBRA 1 abziehen
clr.w D1
lea 2(A4),A0 ; Ptr auf 1. String in Liste
move.b (A0),D1 ; Längenbyte
bra.s L1
L2 move.b (A0)+,D1 ; Längenbyte
lea (A0,D1.w),A0 ; Adresse nächsten Strings
L1 dbra D0,L2
move.b (A0),D1 ; Längenbyte (Korrektur Bug #1)
; letztes Zeichen in searchString in Liste suchen. Abbruch wenn Zeichen
; in Liste größer oder gleich Zeichen in searchString oder wenn Listenende
; erreicht oder wenn SuchString länger als String in Liste ist
move.b (A3,D6.w),D0 ; zu suchendes Zeichen
cmp.b #'z',D0 ; ist es Sonderzeichen?
bhi.s L6 ; ja, abbrechen
cmp.b #'Z',D0 ; Groß/Kleinschreibung ignorieren
bls.s L3
sub.b #$20,D0
bra.s L3
L4 subq.w #1,D5 ; Anzahl restliche Strings
bmi.s L6 ; falls Ende erreicht, abbrechen
addq.w #1,D7 ; Index erhöhen
move.b (A0)+,D1 ; Längenbyte
lea (A0,D1.w),A0 ; Adresse nächsten Strings
move.b (A0),D1 ; Längenbyte (Korrektur Bug #1)
L3 cmp.b D1,D6 ; Falls SuchString länger als
bhi.s L4 ; String in Liste, nächsten String
move.b (A0,D6.w),D1
cmp.b #'Z',D1 ; Groß/Kleinschreibung ignorieren
bls.s L8
sub.b #$20,D1
L8 cmp.b D1,D0 ; mit Zeichen in Liste vergleichen
bhi.s L4 ; Wenn Zeichen in Liste kleiner ist,
; weitersuchen
beq.s L5
L6 clr.w D7 ; nicht gefunden: Index = 0
; Abschließender Test, ob der gefundene String wirklich identisch mit
; dem Suchstring ist
L5 tst.w D7
beq.s L9
clr.w D0
move.b (A3)+,D0 ; Längenbyte des searchStrings
subq.b #1,D0 ; wegen dbra
addq.l #1,A0 ; A0: Ptr auf Listen, ebenfalls Längenbyte überspringen
L12 move.b (A3)+,D1
move.b (A0)+,D2
cmp.b #'Z',D1 ; Groß/Kleinschreibung ignorieren
bls.s L10
sub.b #$20,D1
L10 cmp.b #'Z',D2 ; Groß/Kleinschreibung ignorieren
bls.s L11
sub.b #$20,D2
L11 cmp.b D1,D2
bne.s L6
dbra D0,L12
L9 movea.l 8(A6),A0 ; Index in VAR-Variable
move.w D7,(A0) ; eintragen
movem.l (SP)+,A0/A3/A4/D0/D1/D5/D6/D7
unlk A6
movea.l (SP)+,A0
adda.l #12,SP
jmp (A0)
dc.w 'SEARCH '